package br.com.rafaelSys.var;

import java.util.Arrays;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import br.com.rafaelSys.entidades.AtivoCarteira;
import br.com.rafaelSys.entidades.AtivoSerie;
import br.com.rafaelSys.entidades.Carteira;

public class Calculador {

	private Carteira carteira;
	private EntityManager entityManager;

	public Calculador(Carteira instance, EntityManager entityManager) {
		this.carteira = instance;
		this.entityManager = entityManager;
	}
	
	
	public double[] montaChoqueHistorico(List<AtivoSerie> lista){
		double[] choques = new double[lista.size()-1];
		
		
		AtivoSerie[] retornos = lista.toArray(new AtivoSerie[0]);
		
		
		
		for(int i = 0; i < retornos.length - 1; i++){
			choques[i] = (retornos[i].getClose() + retornos[i+1].getClose())/retornos[i+1].getClose();
		}
		return choques;
	}
	
	public double[] delta(List<AtivoSerie> lista, double[] choques, int quantidade){
		
		double[] deltas = new double[choques.length];
		
			
		
		for(int i = 0; i < deltas.length - 1; i++){
			deltas[i] = quantidade * (lista.get(i).getClose() * choques[i]);
		}
		
		return deltas;
	}
	
	public double var(double[] deltas){
		
		Arrays.sort(deltas);
		return deltas[12];
	}
	
	public void deltaFinal(double[] deltaFinal, double[] deltas){
				
		for(int i = 0; i < deltas.length - 1; i++){
			deltaFinal[i] = deltaFinal[i] + deltas[i];
		}
		
	}
	
	@SuppressWarnings("unchecked")
	public double calculoMaster(){
		Query query = entityManager.createNamedQuery("AtivoCarteira.findByCarteira");
		query.setParameter("carteira", carteira);

		double[] deltaFinal = new double[252];
		
		List<AtivoCarteira> ativosDaCarteira = query.getResultList();
		
		for(AtivoCarteira ativoCarteira : ativosDaCarteira){
			query = entityManager.createNamedQuery("AtivoSerie.listByAtivo");
			query.setParameter("ativo", ativoCarteira.getAtivo());
			List<AtivoSerie> series = query.setMaxResults(252).getResultList();
			
			double[] choques = montaChoqueHistorico(series);
			double[] delta = delta(series, choques, ativoCarteira.getQuantidade());
			
			deltaFinal(deltaFinal, delta);
		}
		
		return var(deltaFinal);
	}
}

